Mobility, Latent Trend and Omega for all states
- Mobility trend for all states (\(\phi\)). Covariate that describes human mobility. These data come from Unacast. We smooth the raw data from Unacast using a spline fit, resulting in the trajectories of human movement shown below. This covariate is used to reduce baseline transmission. Here we show the mobility trends from all 50 states. b) latent trend for all states (\(\psi\)). c) Relativie transmissibility (\(\omega\)) for all states. In each subplot, the read line is a non-weighted mean of all states.
Correlation between Omega and Prevalence
Sample period = March 1, 2020 through December 31, 2021
- predictor = omega(t); response = daily prevalence(t)
California, and mean across states, at varying lags
- predictor = AUC of omega over time; response = cumulative all infections over time
- predictor = AUC of omega; response = cumulative all infections


- map of same (correlation, by state)
To be made
Correlation between Mobility and Omega




R effective for all states
Cross Correlation among times series of R Effective
Error in ncol(x) : object 'x' not found
LS0tCnRpdGxlOiAiRmlndXJlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogRXJpYyBNYXJ0eQotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgb3V0LndpZHRoID0gIjEwMCUiKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoeWFyZHN0aWNrKQojIGxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdnc3RhdHNwbG90KQpzb3VyY2UoaGVyZTo6aGVyZSgiY29kZS9yZXN1bHQtZXhwbG9yYXRpb24vZ2V0UmVmZi5SIikpCgpgYGAKCmBgYHtyIGRhdGF9CmFsbF9maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBoZXJlOjpoZXJlKCJvdXRwdXQvY3VycmVudC8iKSwgcGF0dGVybiA9ICIuY3N2IikKcGFyYW1fZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gaGVyZTo6aGVyZSgib3V0cHV0L2N1cnJlbnQvIiksIHBhdHRlcm4gPSAicGFyYW1zLW5hdHVyYWwucmRzIikKc3RhdGVfc3VtbWFyaWVzIDwtIHRpYmJsZSgpCnN0YXRlX3BhcmFtZXRlcnMgPC0gdGliYmxlKCkKc3RhdGVfbG9nbGlrcyA8LSB0aWJibGUoKQpzdGF0ZWRmIDwtcmVhZFJEUyhoZXJlOjpoZXJlKCJvdXRwdXQvY3VycmVudCIsICJzdGF0ZWRmLnJkcyIpKQpzdGF0ZXZlYyA8LSBnc3ViKCIuY3N2IiwiIixhbGxfZmlsZXMpCmFsbHN0YXRlc19wb3AgPC0gc3RhdGVkZiAlPiUgZmlsdGVyKHN0YXRlX2Z1bGwgJWluJSBzdGF0ZXZlYykgJT4lIHB1bGwodG90YWxfcG9wKSAlPiUgc3VtKCkKCmZvcihpIGluIDE6bGVuZ3RoKGFsbF9maWxlcykpIHsKICBkb19maWxlIDwtIGFsbF9maWxlc1tpXQogIGxvY2F0aW9uIDwtIHN1YigiLmNzdiIsICIiLCBkb19maWxlKQogIHN0YXRlX21ldGFkYXRhIDwtIHN0YXRlZGYgJT4lIGZpbHRlcihzdGF0ZV9mdWxsID09IHN1YigiLmNzdiIsICIiLCBkb19maWxlKSkKICBzdGF0ZV9wb3AgPC0gc3RhdGVfbWV0YWRhdGEgJT4lIHB1bGwodG90YWxfcG9wKQogIHN0YXRlX2luaXRSMCA8LSBzdGF0ZV9tZXRhZGF0YSAlPiUgcHVsbChpbml0UjApCiAgc3RhdGVfYmV0YV9zIDwtIChzdGF0ZV9pbml0UjAqLjEpCiAgCiAgdG1wcGFyYW1maWxlIDwtIGhlcmU6OmhlcmUoIm91dHB1dC9jdXJyZW50IiwgcGFyYW1fZmlsZXNbaV0pCiAgIyB0bXAgc3RhdGUgcGFyYW1zCiAgc3RhdGVwYXJzIDwtIHJlYWRSRFModG1wcGFyYW1maWxlKSAKCiAgc3RhdGVwYXJzX2ZpeGVkIDwtIHN0YXRlcGFycyAlPiUgCiAgICByb3duYW1lc190b19jb2x1bW4odmFyID0gInBhcmFtIikgJT4lIAogICAgZHBseXI6OmZpbHRlcihpc19maXR0ZWQgPT0gIm5vIikgJT4lIAogICAgc2VsZWN0KHBhcmFtLFgxKSAlPiUgCiAgICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IFgxLCBuYW1lc19mcm9tID0gcGFyYW0pICU+JSAKICAgIHNlbGVjdCgtYyhNSUZfSUQsIExvZ0xpaywgTG9nTGlrX1NFKSkKCiAgc3RhdGVwYXJzX2ZpdHRlZCA8LSBzdGF0ZXBhcnMgJT4lIAogICAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJwYXJhbSIpICU+JSAKICAgIGRwbHlyOjpmaWx0ZXIoaXNfZml0dGVkID09ICJ5ZXMiKSAlPiUgCiAgICBzZWxlY3QocGFyYW0sWDEpICU+JSAKICAgIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gWDEsIG5hbWVzX2Zyb20gPSBwYXJhbSkKICAKICBzdGF0ZXBhcnNfYWxsbWxlIDwtIGJpbmRfY29scyhzdGF0ZXBhcnNfZml4ZWQsc3RhdGVwYXJzX2ZpdHRlZCkKICAKICAjIHJlc3VsdHMKCiAgdG1wZmlsZSA8LSBoZXJlOjpoZXJlKCJvdXRwdXQvY3VycmVudCIsIGRvX2ZpbGUpCiAgdG1wIDwtIHJlYWQuY3N2KHRtcGZpbGUpICU+JSBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSkpCiAgZmlyc3RjYXNlZGF0ZSA8LSB0bXAkZGF0ZSAlPiUgbWluKCkKICB0bXAgPC0gdG1wICU+JQogICAgZmlsdGVyKHNpbV90eXBlID09ICJzdGF0dXNfcXVvIiB8IGlzLm5hKHNpbV90eXBlKSwKICAgICAgICAgICB2YXJpYWJsZSAlaW4lIGMoImRhaWx5X2Nhc2VzIiwgImRhaWx5X2RlYXRocyIsICJkYWlseV9hbGxfaW5mZWN0aW9ucyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0dWFsX2RhaWx5X2Nhc2VzIiwgImFjdHVhbF9kYWlseV9kZWF0aHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibW9iaWxpdHlfdHJlbmQiLCAibGF0ZW50X3RyZW5kIiwgImNvbWJpbmVkX3RyZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMiLCAiY3VtdWxhdGl2ZV9kZWF0aHMiKSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBzaW1fdHlwZSwgcGVyaW9kLCBkYXRlLCB2YXJpYWJsZSwgbWVhbl92YWx1ZSkgJT4lIAogICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhcmlhYmxlLCB2YWx1ZXNfZnJvbSA9IG1lYW5fdmFsdWUpICU+JQogICAgIyBjYWxjdWxhdGUgcHJldmFsZW5jZQogICAgbXV0YXRlKHByZXZhbGVuY2UgPSBkYWlseV9hbGxfaW5mZWN0aW9ucyAvIChzdGF0ZV9wb3AtY3VtdWxhdGl2ZV9kZWF0aHMpKSAlPiUgCiAgICAjIGNhbGN1bGF0ZSBvbWVnYQogICAgbXV0YXRlKG9tZWdhID0gY29tYmluZWRfdHJlbmQgKiBzdGF0ZXBhcnNfYWxsbWxlJGJldGFfcykgJT4lIAogICAgIyBjYWxjdWxhdGUgbWVhbiBTCiAgICBtdXRhdGUoUyA9IHN0YXRlX3BvcCAtIGN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMpICU+JSAKICAgIG11dGF0ZShzdXNjZXB0aWJsZV9mcmFjdGlvbiA9IFMgLyAoc3RhdGVfcG9wIC0gY3VtdWxhdGl2ZV9kZWF0aHMpKSAlPiUgCiAgICAjIGNhbGN1bGF0ZSBxCiAgICBtdXRhdGUocSA9IGdldF9xKHQgPSBhcy5udW1lcmljKGRhdGUtZmlyc3RjYXNlZGF0ZSksIHBhcmFtcyA9IHN0YXRlcGFyc19hbGxtbGUpKSAlPiUKICAgICMgY2FsY3VsYXRlIHMKICAgIG11dGF0ZShzID0gZ2V0X3ModCA9IGFzLm51bWVyaWMoZGF0ZS1maXJzdGNhc2VkYXRlKSwgcGFyYW1zID0gc3RhdGVwYXJzX2FsbG1sZSkpICU+JQogICAgIyBjYWxjdWxhdGUgbWVhbiBSX2UKICAgIG11dGF0ZShSX2UgPSBnZXRSZWZmKFMgPSBTLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG9tZWdhID0gb21lZ2EsCiAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcSwKICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gc3RhdGVwYXJzX2FsbG1sZSkpICU+JQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAhYyhsb2NhdGlvbiwgc2ltX3R5cGUsIHBlcmlvZCwgZGF0ZSksIAogICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInZhcmlhYmxlIiwgCiAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIm1lYW5fdmFsdWUiLAogICAgICAgICAgICAgICAgIHZhbHVlc19kcm9wX25hID0gVFJVRSkKCiAgc3RhdGVfc3VtbWFyaWVzIDwtIGJpbmRfcm93cyhzdGF0ZV9zdW1tYXJpZXMsIHRtcCkKfQoKIyAjIEZpeGVkIHBhcmFtZXRlcnMgdGFibGUKIyBiZXRhc19uYW1lcyA8LSBybm1zW2dyZXAoImJbMC05XSsiLCBybm1zKV0gIyBmaW5kIHBhcmFtZXRlcnMgc3RhcnRpbmcgd2l0aCBiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIKIyBzcGxpbmVfY29lZmZpY2llbnRzIDwtIHBhc3RlKCJTcGxpbmUgY29lZmZpY2llbnQiLCBnc3ViKCJiIiwiIiwgYmV0YXNfbmFtZXMpKQojIG5hbWVzKHNwbGluZV9jb2VmZmljaWVudHMpIDwtIGJldGFzX25hbWVzCiMgCiMgcGFyYW1zX3ZlYyA8LSBjKE1JRl9JRCA9ICJNSUYgaWQiLCAKIyAgICAgICAgICAgICAgICAgTG9nTGlrID0gIkxvZyBMaWtlbGlob29kIiwgCiMgICAgICAgICAgICAgICAgIExvZ0xpa19TRSA9ICJTRSBvZiBMb2cgTGlrZWxpaG9vZCIsIAojICAgICAgICAgICAgICAgICBiZXRhX3MgPSAiVHJhbnNtaXNzaW9uIHJhdGUiLAojICAgICAgICAgICAgICAgICAjIFJlbGF0aXZlIFRyYW5zbWlzc2liaWxpdHkKIyAgICAgICAgICAgICAgICAgZnJhY190cmFuc19lID0gIlJlbGF0aXZlIHRyYW5zbWlzc2liaWxpdHkgb2YgbGF0ZW50IGluZmVjdGlvbnMiLAojICAgICAgICAgICAgICAgICBmcmFjX3RyYW5zX2EgPSAiUmVsYXRpdmUgdHJhbnNtaXNzaWJpbGl0eSBvZiBhc3ltcHRvbWF0aWMgaW5kaXZpZHVhbHMiLAojICAgICAgICAgICAgICAgICBmcmFjX3RyYW5zX2MgPSAiUmVsYXRpdmUgdHJhbnNtaXNzaWJpbGl0eSBvZiBkZXRlY3RlZCBzeW1wdG9tYXRpYyBpbmRpdmlkdWFscyBwb3N0LXJlcG9ydGluZyIsCiMgICAgICAgICAgICAgICAgIGZyYWNfdHJhbnNfaCA9ICJSZWxhdGl2ZSB0cmFuc21pc3NpYmlsaXR5IG9mIGhvc3BpdGFsaXplZCBpbmRpdmlkdWFscyIsCiMgICAgICAgICAgICAgICAgICMgVGltZSBpbiBjb21wYXJ0bWVudHMKIyAgICAgICAgICAgICAgICAgdGltZV9lID0gIlRpbWUgc3BlbnQgaW4gbGF0ZW50IGNvbXBhcnRtZW50cyAoZGF5cykiLAojICAgICAgICAgICAgICAgICB0aW1lX2EgPSAiVGltZSBzcGVudCBpbiBhc3ltcHRvbWF0aWMgY29tcGFydG1lbnRzIChkYXlzKSIsCiMgICAgICAgICAgICAgICAgIHRpbWVfc3UgPSAiVGltZSBzcGVudCBpbiBzeW1wdG9tYXRpYywgdW5kZXRlY3RlZCBjb21wYXJ0bWVudHMgKGRheXMpIiwKIyAgICAgICAgICAgICAgICAgdGltZV9zZCA9ICJUaW1lIHNwZW50IGluIHN5bXB0b21hdGljLCBkZXRlY3RlZCBjb21wYXJ0bWVudHMgKGRheXMpIiwKIyAgICAgICAgICAgICAgICAgdGltZV9jID0gIlRpbWUgc3BlbnQgaW4gZGlhZ25vc2VkIGNhc2VzIGNvbXBhcnRtZW50cyAoZGF5cykiLAojICAgICAgICAgICAgICAgICB0aW1lX2ggPSAiVGltZSBzcGVudCBpbiBob3NwaXRhbGl6ZWQgY29tcGFydG1lbnRzIChkYXlzKSIsCiMgICAgICAgICAgICAgICAgICMgRGV0ZWN0aW9uIHRpbWUKIyAgICAgICAgICAgICAgICAgbWF4X2RpYWdfZmFjdG9yID0gIk1heGltdW0gZm9yIGZhY3RvciBieSB3aGljaCBtb3ZlbWVudCB0aHJvdWdoIElzZCBoYXBwZW5zIGZhc3RlciAocXVpY2tlciBkaWFnbm9zaXMpIiwKIyAgICAgICAgICAgICAgICAgZGlhZ19yYW1wdXAgPSAiUmF0ZSBhdCB3aGljaCBmYXN0ZXIgZGlhZ25vc2lzIHJhbXBzIHVwIHRvIG1heCIsCiMgICAgICAgICAgICAgICAgIHRfaGFsZl9kaWFnID0gIlRpbWUgYXQgd2hpY2ggZGlhZ25vc2lzIGlzIGF0IDUwJSBvZiBtYXggKGluIGRheXMgc2luY2UgdCA9IDEpIiwKIyAgICAgICAgICAgICAgICAgIyBEZXRlY3Rpb24gZnJhY3Rpb24KIyAgICAgICAgICAgICAgICAgbWF4X2RldGVjdF9mcmFjID0gIk1heGltdW0gZnJhY3Rpb24gb2YgY2FzZXMgdGhhdCBhcmUgZGV0ZWN0ZWQiLAojICAgICAgICAgICAgICAgICBkZXRlY3RfcmFtcHVwID0gIlNwZWVkIGF0IHdoaWNoIGZyYWN0aW9uIGRldGVjdGVkIHJhbXBzIHVwIiwKIyAgICAgICAgICAgICAgICAgdF9oYWxmX2RldGVjdCA9ICJUaW1lIGF0IHdoaWNoIGluZmVjdGlvbiBkZXRlY3Rpb24gZnJhY3Rpb24gaXMgYXQgNTAlIG9mIG1heCAoaW4gZGF5cyBzaW5jZSB0ID0gMSkiLAojICAgICAgICAgICAgICAgICBiYXNlX2RldGVjdF9mcmFjID0gIk1pbmltdW0gZnJhY3Rpb24gZGV0ZWN0ZWQgYXQgdCA9IDEiLAojICAgICAgICAgICAgICAgICAjIEZyYWN0aW9uIGFzeW1wdG9tYXRpYwojICAgICAgICAgICAgICAgICBmcmFjX2FzeW0gPSAiRnJhY3Rpb24gb2YgbGF0ZW50IGluZmVjdGlvbnMgdGhhdCBtb3ZlIHRvIGFzeW1wdG9tYXRpYyIsCiMgICAgICAgICAgICAgICAgICMgRnJhY3Rpb24gaG9zcHRpbGl6ZWQKIyAgICAgICAgICAgICAgICAgZnJhY19ob3NwID0gIkZyYWN0aW9uIG9mIGRldGVjdGVkIGNhc2VzIHRoYXQgYXJlIGhvc3BpdGFsaXplZCIsCiMgICAgICAgICAgICAgICAgICMgRnJhY3Rpb24gb2YgaG9zcGl0YWxpemF0aW9ucyB0aGF0IHJlc3VsdCBpbiBkZWF0aAojICAgICAgICAgICAgICAgICBtaW5fZnJhY19kZWFkID0gIk1heGltdW0gZnJhY3Rpb24gb2YgaG9zcGl0YWxpemF0aW9ucyB0aGF0IHJlc3VsdCBpbiBkZWF0aCIsCiMgICAgICAgICAgICAgICAgIG1heF9mcmFjX2RlYWQgPSAiTWF4aW11bSBmcmFjdGlvbiBvZiBob3NwaXRhbGl6YXRpb25zIHRoYXQgcmVzdWx0IGluIGRlYXRoIiwKIyAgICAgICAgICAgICAgICAgbG9nX2hhbGZfZGVhZCA9ICJUaW1lIGF0IHdoaWNoIGRlYXRoIGZyYWN0aW9uIGlzIGF0IDUwJSBvZiBtYXggKGluIGRheXMgc2luY2UgdCA9IDEpIiwKIyAgICAgICAgICAgICAgICAgIyBEaXNwZXJzaW9uIHBhcmFtZXRlcnMKIyAgICAgICAgICAgICAgICAgdGhldGFfY2FzZXMgPSAiRGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIGNhc2UgcmVwb3J0aW5nIG9ic2VydmF0aW9uIHByb2Nlc3MiLAojICAgICAgICAgICAgICAgICB0aGV0YV9ob3NwcyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgaG9zcGl0YWxpemF0aW9uIHJlcG9ydGluZyBvYnNlcnZhdGlvbiBwcm9jZXNzIiwKIyAgICAgICAgICAgICAgICAgdGhldGFfZGVhdGhzID0gIkRpc3BlcnNpb24gcGFyYW1ldGVyIGZvciBkZWF0aCByZXBvcnRpbmcgb2JzZXJjYXRpb24gcHJvY2VzcyIsCiMgICAgICAgICAgICAgICAgIHNpZ21hX2R3ID0gIlZhcmlhbmNlIG9mIHRoZSBzdG9jaGFzdGljcyBwcm9jZXNzIG5vaXNlIiwKIyAgICAgICAgICAgICAgICAgIyBTcGxpbmUgY29lZmZpY2llbnRzCiMgICAgICAgICAgICAgICAgIHNwbGluZV9jb2VmZmljaWVudHMsCiMgICAgICAgICAgICAgICAgICMgSW5pdGlhbCBjb25kaXRpb25zCiMgICAgICAgICAgICAgICAgIFNfMCA9ICJJbml0aWFsIG51bWJlciBvZiBzdXNjZXB0aWJsZSBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiMgICAgICAgICAgICAgICAgIEUxXzAgPSAiSW5pdGlhbCBudW1iZXIgb2YgbGF0ZW50IGluZmVjdGlvdXMgaW5kaXZpZHVhbHMgb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICBJYTFfMCA9ICJJbml0aWFsIG51bWJlciBvZiBhc3ltcHRvbWF0aWMgaW5kaXZpZHVhbHMgb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICBJc3UxXzAgPSAiSW5pdGlhbCBudW1iZXIgb2Ygc3ltcHRvbWF0aWMsIHVuZGV0ZWN0ZWQgaW5kaXZpZHVhbHMgb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICBJc2QxXzAgPSAiSW5pdGlhbCBudW1iZXIgb2Ygc3ltcHRvbWF0aWMsIGRldGVjdGVkIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKIyAgICAgICAgICAgICAgICAgQzFfMCA9ICJJbml0aWFsIG51bWJlciBvZiBkaWFnbm9zZWQgY2FzZXMgb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICBIMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGhvc3BpdGFsaXplZCBjYXNlcyBvbiB0ID0gMSIsCiMgICAgICAgICAgICAgICAgIFJfMCA9ICJJbml0aWFsIG51bWJlciBvZiByZWNvdmVyZWQgaW5kaXZpZHVhbHMgb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICBEXzAgPSAiSW5pdGlhbCBudW1iZXIgb2YgZGVhdGhzIGFmdGVyIGhvc3BpdGFsaXphdGlvbiBvbiB0ID0gMSIsCiMgICAgICAgICAgICAgICAgIHRyZW5kX3N0YXJ0ID0gIlRyZW5kIikKIyAKIyB0bXBwYXJhbXMgPC0gcmVhZFJEUyh0bXBwYXJhbWZpbGUpCiMgcm5tcyA8LSByb3cubmFtZXModG1wcGFyYW1zKQojIHBhcmFtc19tYXAgPC0gdGliYmxlKFBhcmFtZXRlciA9IG5hbWVzKHBhcmFtc192ZWMpLAojICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0gcGFyYW1zX3ZlYykKIyBmaXhlZF9wYXJhbWV0ZXJzIDwtIHRtcHBhcmFtcyAlPiUKIyAgIG11dGF0ZShQYXJhbWV0ZXIgPSBybm1zKSAlPiUKIyAgIGZpbHRlcihpc19maXR0ZWQgPT0gIm5vIikgJT4lCiMgICBkcGx5cjo6c2VsZWN0KC1pc19maXR0ZWQpICU+JQojICAgZ2F0aGVyKCJrZXkiLCAidmFsdWUiLCAtUGFyYW1ldGVyKSAlPiUKIyAgIGZpbHRlcihrZXkgPT0gIlgxIikgJT4lCiMgICBsZWZ0X2pvaW4ocGFyYW1zX21hcCwgYnkgPSAiUGFyYW1ldGVyIikgJT4lCiMgICBmaWx0ZXIoIVBhcmFtZXRlciAlaW4lIGMoIk1JRl9JRCIsICJMb2dMaWsiLCAiTG9nTGlrX1NFIiwgInRyZW5kX3N0YXJ0IiwgInRoZXRhX2hvc3BzIiwgIlNfMCIpKSAlPiUKIyAgIGRwbHlyOjpzZWxlY3QoUGFyYW1ldGVyLCBEZXNjcmlwdGlvbiwgdmFsdWUpICU+JQojICAgbXV0YXRlKFBhcmFtZXRlciA9IGlmZWxzZShQYXJhbWV0ZXIgPT0gIkUxXzAiLCAiTDFfMCIsIFBhcmFtZXRlcikpCgojIEtleSBEYXRlcwpmdXR1cmUgPC0gc3RhdGVfc3VtbWFyaWVzICU+JSBmaWx0ZXIocGVyaW9kID09ICJGdXR1cmUiKSAlPiUgcHVsbChkYXRlKSAlPiUgcmFuZ2UoKQpidXJuaW4gPC0gYyhzdGF0ZV9zdW1tYXJpZXMgJT4lIHB1bGwoZGF0ZSkgJT4lIG1pbigpLCBhcy5EYXRlKCIyMDIwLTAzLTAxIikpCnNhbXBsZV9wZXJpb2QgPC0gYyhhcy5EYXRlKCIyMDIwLTAzLTAxIiksYXMuRGF0ZSgiMjAyMC0xMi0zMSIpKQoKYGBgCgojIE1vYmlsaXR5LCBMYXRlbnQgVHJlbmQgYW5kIE9tZWdhIGZvciBhbGwgc3RhdGVzCgphKSBNb2JpbGl0eSB0cmVuZCBmb3IgYWxsIHN0YXRlcyAoJFxwaGkkKS4gQ292YXJpYXRlIHRoYXQgZGVzY3JpYmVzIGh1bWFuIG1vYmlsaXR5LiBUaGVzZSBkYXRhIGNvbWUgZnJvbSA8YSBocmVmPSJodHRwczovL3d3dy51bmFjYXN0LmNvbS8iIHRhcmdldD0iX2JsYW5rIj5VbmFjYXN0PC9hPi4gV2Ugc21vb3RoIHRoZSByYXcgZGF0YSBmcm9tIFVuYWNhc3QgdXNpbmcgYSBzcGxpbmUgZml0LCByZXN1bHRpbmcgaW4gdGhlIHRyYWplY3RvcmllcyBvZiBodW1hbiBtb3ZlbWVudCBzaG93biBiZWxvdy4gVGhpcyBjb3ZhcmlhdGUgaXMgdXNlZCB0byByZWR1Y2UgYmFzZWxpbmUgdHJhbnNtaXNzaW9uLiBIZXJlIHdlIHNob3cgdGhlIG1vYmlsaXR5IHRyZW5kcyBmcm9tIGFsbCA1MCBzdGF0ZXMuIGIpIGxhdGVudCB0cmVuZCBmb3IgYWxsIHN0YXRlcyAoJFxwc2kkKS4gYykgUmVsYXRpdmllIHRyYW5zbWlzc2liaWxpdHkgKCRcb21lZ2EkKSBmb3IgYWxsIHN0YXRlcy4gSW4gZWFjaCBzdWJwbG90LCB0aGUgcmVhZCBsaW5lIGlzIGEgbm9uLXdlaWdodGVkIG1lYW4gb2YgYWxsIHN0YXRlcy4KCmBgYHtyIGNvdmFyaWF0ZSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NywgZXZhbCA9IFRSVUV9CmFsbF9waGkgPC0gc3RhdGVfc3VtbWFyaWVzICU+JQogIGZpbHRlcih2YXJpYWJsZSA9PSAibW9iaWxpdHlfdHJlbmQiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUocGhpID0gbWVhbl92YWx1ZSkgJT4lIAogIGZpbHRlcihkYXRlIDw9IFN5cy5EYXRlKCkpCgptZWFuX3BoaSA8LSBhbGxfcGhpICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKHBoaSA9IG1lYW4ocGhpKSkKCmdfcGhpIDwtIGdncGxvdChhbGxfcGhpLCBhZXMoeCA9IGRhdGUsIHkgPSBwaGksIGNvbG9yID0gbG9jYXRpb24pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICAjIHlsYWIoIkh1bWFuIG1vdmVtZW50XG4oJSBvZiBub3JtYWwpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xLCBhbHBoYSA9IC42LCBlbmQgPSAuNzUpICsKICAjIHRoZW1lX2RhcmsoYmFzZV9saW5lX3NpemUgPSAwLjUpICsKICBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fcGhpLCBhbHBoYSA9IC42LCBzaXplID0gMiwgY29sb3IgPSAncmVkJykgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluPWZ1dHVyZVsxXSwgeG1heD1mdXR1cmVbMl0sIHltaW49MCwgeW1heD0xKSkgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGZ1dHVyZVsxXSwgeG1heCA9IGZ1dHVyZVsyXSwgeW1pbiA9IDAsIHltYXggPSAxLCBhbHBoYSA9IC4yKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkKCnBfcGhpIDwtIGdfcGhpICU+JSBwbG90bHk6OmdncGxvdGx5KCkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAjIG1hcmdpbiA9IGxpc3QobCA9IDE1MCksCiAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBoaSIpCiAgICAgICAgICAgICAgICAgKQoKcF9waGkkeCRkYXRhW1s1MV1dJHRleHQgPC0gZ3N1YigncmVkJywnTWVhbiBvZiBhbGwgc3RhdGVzJywgcF9waGkkeCRkYXRhW1s1MV1dJHRleHQpCgojIHBfcGhpCmBgYAoKCmBgYHtyfQphbGxfcHNpIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIodmFyaWFibGUgPT0gImxhdGVudF90cmVuZCIpICU+JQogIGRwbHlyOjpzZWxlY3QobG9jYXRpb24sIGRhdGUsIG1lYW5fdmFsdWUpICU+JQogIHJlbmFtZShwc2kgPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkKCm1lYW5fcHNpIDwtIGFsbF9wc2kgJT4lIGdyb3VwX2J5KGRhdGUpICU+JSBzdW1tYXJpc2UocHNpID0gbWVhbihwc2kpKQoKZ19wc2kgPC0gZ2dwbG90KGFsbF9wc2ksIGFlcyh4ID0gZGF0ZSwgeSA9IHBzaSwgY29sb3IgPSBsb2NhdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogICMgeWxhYigiTGF0ZW50IHRyZW5kXG4oJSBvZiBub3JtYWwpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xLCBhbHBoYSA9IC42LCBlbmQgPSAuNzUpICsKICAjIHRoZW1lX2RhcmsoYmFzZV9saW5lX3NpemUgPSAwLjUpICsKICBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fcHNpLCBhbHBoYSA9IC42LCBzaXplID0gMiwgY29sb3IgPSAncmVkJykgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGZ1dHVyZVsxXSwgeG1heCA9IGZ1dHVyZVsyXSwgeW1pbiA9IDAsIHltYXggPSAxLCBhbHBoYSA9IC4yKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkKCnBfcHNpIDwtIGdfcHNpICU+JSBwbG90bHk6OmdncGxvdGx5KCkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAjIG1hcmdpbiA9IGxpc3QobCA9IDE1MCksCiAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBzaSIpCiAgICAgICAgICAgICAgICAgKQoKcF9wc2kkeCRkYXRhW1s1MV1dJHRleHQgPC0gZ3N1YigncmVkJywnTWVhbiBvZiBhbGwgc3RhdGVzJywgcF9wc2kkeCRkYXRhW1s1MV1dJHRleHQpCgojIHBfcHNpCmBgYAoKCmBgYHtyfQphbGxfb21lZ2EgPC0gc3RhdGVfc3VtbWFyaWVzICU+JQogIGZpbHRlcih2YXJpYWJsZSA9PSAib21lZ2EiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUob21lZ2EgPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkKCm1lYW5fb21lZ2EgPC0gYWxsX29tZWdhICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKG9tZWdhID0gbWVhbihvbWVnYSkpCgptYXhfb21lZ2EgPC0gbWF4KGFsbF9vbWVnYSRvbWVnYSkKCmdfb21lZ2EgPC0gZ2dwbG90KGFsbF9vbWVnYSwgYWVzKHggPSBkYXRlLCB5ID0gb21lZ2EsIGNvbG9yID0gbG9jYXRpb24pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICAjIHlsYWIoIkxhdGVudCB0cmVuZFxuKCUgb2Ygbm9ybWFsKSIpICsKICAjIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xLCBhbHBoYSA9IC42LCBlbmQgPSAuNzUpICsKICAjIHRoZW1lX2RhcmsoYmFzZV9saW5lX3NpemUgPSAwLjUpICsKICBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fb21lZ2EsIGFscGhhID0gLjYsIHNpemUgPSAyLCBjb2xvciA9ICdyZWQnKSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gZnV0dXJlWzFdLCB4bWF4ID0gZnV0dXJlWzJdLCB5bWluID0gMCwgeW1heCA9IGFsbF9vbWVnYSRvbWVnYSwgYWxwaGEgPSAuMikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpCgpwX29tZWdhIDwtIGdfb21lZ2EgJT4lIHBsb3RseTo6Z2dwbG90bHkoKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICMgbWFyZ2luID0gbGlzdChsID0gMTUwKSwKICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiT21lZ2EiKQogICAgICAgICAgICAgICAgICkKCnBfb21lZ2EkeCRkYXRhW1s1MV1dJHRleHQgPC0gZ3N1YigncmVkJywnTWVhbiBvZiBhbGwgc3RhdGVzJywgcF9vbWVnYSR4JGRhdGFbWzUxXV0kdGV4dCkKCiMgcF9vbWVnYQpgYGAKCmBgYHtyfQpwbG90bHk6OnN1YnBsb3QocF9waGksIHBfcHNpLCBwX29tZWdhLCBucm93cyA9IDMsIHNoYXJlWCA9IFRSVUUsIHRpdGxlWSA9IFRSVUUpCmBgYAoKIyBDb3JyZWxhdGlvbiBiZXR3ZWVuIE9tZWdhIGFuZCBQcmV2YWxlbmNlCgpTYW1wbGUgcGVyaW9kID0gTWFyY2ggMSwgMjAyMCB0aHJvdWdoIERlY2VtYmVyIDMxLCAyMDIxCgphKSBwcmVkaWN0b3IgPSBvbWVnYSh0KTsgcmVzcG9uc2UgPSBkYWlseSBwcmV2YWxlbmNlKHQpCgpgYGB7cn0KCmFsbF9wcmV2YWxlbmNlIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIocGVyaW9kID09ICJQYXN0IikgJT4lCiAgZmlsdGVyKGJldHdlZW4oZGF0ZSwgc2FtcGxlX3BlcmlvZFsxXSwgc2FtcGxlX3BlcmlvZFsyXSkpICU+JSAKICBmaWx0ZXIodmFyaWFibGUgPT0gInByZXZhbGVuY2UiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUocHJldmFsZW5jZSA9IG1lYW5fdmFsdWUpICU+JSAKICBmaWx0ZXIoZGF0ZSA8PSBTeXMuRGF0ZSgpKQoKbWVhbl9hbGxfcHJldmFsZW5jZSA8LSBhbGxfcHJldmFsZW5jZSAlPiUgZ3JvdXBfYnkoZGF0ZSkgJT4lIHN1bW1hcmlzZShwcmV2YWxlbmNlID0gbWVhbihwcmV2YWxlbmNlKSkKIyBwbG90KHggPSBtZWFuX29tZWdhJG1lYW5fdmFsdWUsIHkgPSBtZWFuX2FsbF9wcmV2YWxlbmNlJHByZXZhbGVuY2UpCgptZWFucyA8LSBtZWFuX3BoaSAlPiUgCiAgZnVsbF9qb2luKG1lYW5fcHNpKSAlPiUgCiAgZnVsbF9qb2luKG1lYW5fb21lZ2EpICU+JSAKICBmdWxsX2pvaW4obWVhbl9hbGxfcHJldmFsZW5jZSkKCnN0YXRlX3N1bW1hcmllc193aWRlIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIocGVyaW9kID09ICJQYXN0IikgJT4lCiAgZmlsdGVyKGJldHdlZW4oZGF0ZSwgc2FtcGxlX3BlcmlvZFsxXSwgc2FtcGxlX3BlcmlvZFsyXSkpICU+JSAKICBmaWx0ZXIoc2ltX3R5cGUgPT0gJ3N0YXR1c19xdW8nKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhcmlhYmxlLCB2YWx1ZXNfZnJvbSA9IG1lYW5fdmFsdWUpICU+JSAKICBncm91cF9ieShsb2NhdGlvbikgJT4lIAogIG11dGF0ZShBVV9vbWVnYSA9IGN1bXN1bShvbWVnYSkpCgpDQSA8LSBzdGF0ZV9zdW1tYXJpZXNfd2lkZSAlPiUgZmlsdGVyKGxvY2F0aW9uID09ICJDYWxpZm9ybmlhIikKCmxhZ2ZpbGwgPC0gZnVuY3Rpb24oeCwgbGFnLGZpbGw9MSkgewogIHJlcGxhY2VfbmEobGFnKHgsbGFnKSxmaWxsKQp9CgpDQSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwob21lZ2EsMCksIHkgPSB+cHJldmFsZW5jZSwgCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ2FsaWZvcm5pYSIseGF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSx5YXhpcz1saXN0KHRpdGxlPSJwcmV2YWxlbmNlIikpCgpzdGF0ZV9zdW1tYXJpZXNfd2lkZSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwob21lZ2EsMCksIHkgPSB+cHJldmFsZW5jZSwgY29sb3IgPSB+bG9jYXRpb24sCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUsICc8L2JyPiBTdGF0ZTogJywgbG9jYXRpb24gKSkgJT4lIAogICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQWxsIHN0YXRlcyIsIHhheGlzPWxpc3QodGl0bGU9Im9tZWdhIikseWF4aXM9bGlzdCh0aXRsZT0icHJldmFsZW5jZSIpKQoKbWVhbnMgJT4lIGZpbHRlcihkYXRlIDwgZnV0dXJlWzFdKSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfm9tZWdhLCB5ID0gfnByZXZhbGVuY2UsICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlICkpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJNZWFuIG9tZWdhLCBtZWFuIHByZXZhbGVuY2UgKGFjcm9zcyBzdGF0ZXMpIix4YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpLHlheGlzPWxpc3QodGl0bGU9InByZXZhbGVuY2UiKSkKCmBgYAoKLS0tCgpDYWxpZm9ybmlhLCBhbmQgbWVhbiBhY3Jvc3Mgc3RhdGVzLCBhdCB2YXJ5aW5nIGxhZ3MKCmBgYHtyfQpDQSAlPiUgZmlsdGVyKHBlcmlvZCA9PSAnUGFzdCcpICU+JSAKICBmaWx0ZXIoYmV0d2VlbihkYXRlLCBzYW1wbGVfcGVyaW9kWzFdLCBzYW1wbGVfcGVyaW9kWzJdKSkgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKG9tZWdhLDApLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDAiLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBPbWVnYTogJywgb21lZ2EsICc8L2JyPiBwcmV2YWxlbmNlOiAnLCBwcmV2YWxlbmNlLCAnPC9icj4gRGF0ZTogJywgZGF0ZSkpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsNyksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgNyIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMTQpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDE0IikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwyMSksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMjEiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDI4KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAyOCIpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJDYWxpZm9ybmlhLCBvbWVnYSBhdCB2YXJ5aW5nIGxhZ3MiLCB4YXhpcyA9IGxpc3QodGl0bGUgPSAib21lZ2EiKSkKCm1lYW5zICU+JSBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKG9tZWdhLDApLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDAiLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBPbWVnYTogJywgb21lZ2EsICc8L2JyPiBwcmV2YWxlbmNlOiAnLCBwcmV2YWxlbmNlLCAnPC9icj4gRGF0ZTogJywgZGF0ZSkpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsNyksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgNyIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMTQpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDE0IikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwyMSksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMjEiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDI4KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAyOCIpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJNZWFuIG9tZWdhLCBtZWFuIHByZXZhbGVuY2UgKGFjcm9zcyBzdGF0ZXMpXG5vbWVnYSBhdCB2YXJ5aW5nIGxhZ3MiLCB4YXhpcyA9IGxpc3QodGl0bGUgPSAib21lZ2EiKSkKCmBgYAoKLS0tCgpiKSBwcmVkaWN0b3IgPSBBVUMgb2Ygb21lZ2Egb3ZlciB0aW1lOyByZXNwb25zZSA9IGN1bXVsYXRpdmUgYWxsIGluZmVjdGlvbnMgb3ZlciB0aW1lCgpgYGB7cn0KCkNBICU+JSBmaWx0ZXIocGVyaW9kID09ICdQYXN0JykgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKEFVX29tZWdhLDApLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAnbGFnIDAnLCAKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBBcmVhIHVuZGVyIE9tZWdhOiAnLCBBVV9vbWVnYSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2JyPiBDdW11bGF0aXZlIGluZmVjdGlvbnM6ICcsIGN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gRGF0ZTogJywgZGF0ZSkpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsNyksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgbmFtZSA9ICJsYWcgNyIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsMTQpLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAibGFnIDE0IikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChBVV9vbWVnYSwyMSksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgbmFtZSA9ICJsYWcgMjEiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDI4KSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gImxhZyAyOCIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsNTYpLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAibGFnIDU2IikgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkNhbGlmb3JuaWEsIGFyZWEgdW5kZXIgb21lZ2EgYXQgdmFyeWluZyBsYWdzIix4YXhpcz1saXN0KHRpdGxlPSJBcmVhIHVuZGVyIG9tZWdhIikseWF4aXM9bGlzdCh0aXRsZT0iQ3VtdWxhdGl2ZSBpbmZlY3Rpb25zIikpCgpzdGF0ZV9zdW1tYXJpZXNfd2lkZSAlPiUgZmlsdGVyKHBlcmlvZCA9PSAnUGFzdCcpICU+JSAKICBmaWx0ZXIoZGF0ZSA+IGJ1cm5pblsyXSkgJT4lCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsMCksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgY29sb3IgPSB+bG9jYXRpb24sCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gQXJlYSB1bmRlciBPbWVnYTogJywgQVVfb21lZ2EsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gQ3VtdWxhdGl2ZSBpbmZlY3Rpb25zOiAnLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IERhdGU6ICcsIGRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2JyPiBTdGF0ZTogJywgbG9jYXRpb24pKSAlPiUgCiAgICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJBbGwgc3RhdGVzIiwgeGF4aXM9bGlzdCh0aXRsZT0iQXJlYSB1bmRlciBvbWVnYSAobGFnIDApIiksIHlheGlzPWxpc3QodGl0bGU9IkN1bXVsYXRpdmUgaW5mZWN0aW9ucyIpKQoKCmBgYAoKLS0tCgpjKSBwcmVkaWN0b3IgPSBBVUMgb2Ygb21lZ2E7IHJlc3BvbnNlID0gY3VtdWxhdGl2ZSBhbGwgaW5mZWN0aW9ucwoKYGBge3J9CiMgc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIAojICAgZmlsdGVyKHBlcmlvZCA9PSAnUGFzdCcpICU+JQojICAgZmlsdGVyKGRhdGUgPiBidXJuaW5bMl0pICU+JQojICAgZ3JvdXBfYnkobG9jYXRpb24pICU+JSAKIyAgIHN1bW1hcmlzZShBVV9vbWVnYSA9IG1heChBVV9vbWVnYSksIGN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMgPSBtYXgoY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucykpICU+JSAKIyAgIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAojICAgICAgICAgICAgICAgICB4ID0gfkFVX29tZWdhLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsCiMgICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiMgICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IEFyZWEgdW5kZXIgT21lZ2E6ICcsIEFVX29tZWdhLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gQ3VtdWxhdGl2ZSBpbmZlY3Rpb25zOiAnLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gU3RhdGU6ICcsIGxvY2F0aW9uKSkgJT4lIAojICAgICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJDb3JyZWxhdGlvbiBvZiBjdW11bGF0aXZlIGluZmVjdGlvbiB3aXRoIEFyZWEgdW5kZXIgb21lZ2EiLCB4YXhpcz1saXN0KHRpdGxlPSJBcmVhIHVuZGVyIG9tZWdhIiksIHlheGlzPWxpc3QodGl0bGU9IkN1bXVsYXRpdmUgaW5mZWN0aW9ucyIpKQoKc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIAogIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUKIyAgZmlsdGVyKGRhdGUgPiBidXJuaW5bMl0pICU+JQogIGZpbHRlcihkYXRlID49IHNhbXBsZV9wZXJpb2RbMV0gJiBkYXRlIDw9IHNhbXBsZV9wZXJpb2RbMl0pICU+JSAKICBncm91cF9ieShsb2NhdGlvbikgJT4lIAogIHN1bW1hcmlzZShBVV9vbWVnYSA9IG1heChBVV9vbWVnYSksIGN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMgPSBtYXgoY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucykpICU+JSAKICBnZ3N0YXRzcGxvdDo6Z2dzY2F0dGVyc3RhdHMoeCA9ICJBVV9vbWVnYSIsIHkgPSAiY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucyIsIHR5cGUgPSAic3BlYXJtYW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiQ29ycmVsYXRpb24gb2YgY3VtdWxhdGl2ZSBpbmZlY3Rpb25zIHdpdGggQXJlYSB1bmRlciBvbWVnYSIpCgpgYGAKCi0tLQoKZSkgbWFwIG9mIHNhbWUgKGNvcnJlbGF0aW9uLCBieSBzdGF0ZSkKClRvIGJlIG1hZGUKCiMgQ29ycmVsYXRpb24gYmV0d2VlbiBNb2JpbGl0eSBhbmQgT21lZ2EKCmBgYHtyfQoKQ0EgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5tb2JpbGl0eV90cmVuZCwgeSA9IH5vbWVnYSwgCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gTW9iaWxpdHk6ICcsIG1vYmlsaXR5X3RyZW5kLCAnPC9icj4gb21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gRGF0ZTogJywgZGF0ZSkpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJDYWxpZm9ybmlhIix4YXhpcz1saXN0KHRpdGxlPSJtb2JpbGl0eSB0cmVuZCIpLHlheGlzPWxpc3QodGl0bGU9Im9tZWdhIikpCgpDQSAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAogIGZpbHRlcihkYXRlID4gYnVybmluWzJdKSAlPiUKICBzZWxlY3QoZGF0ZSxtb2JpbGl0eV90cmVuZCxvbWVnYSkgJT4lIAogIGdnc3RhdHNwbG90OjpnZ3NjYXR0ZXJzdGF0cyh4ID0gIm1vYmlsaXR5X3RyZW5kIiwgeSA9ICJvbWVnYSIsIHR5cGUgPSAic3BlYXJtYW4iLCB0aXRsZSA9ICJDYWxpZm9ybmlhIikKCgpzdGF0ZV9zdW1tYXJpZXNfd2lkZSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfm1vYmlsaXR5X3RyZW5kLCB5ID0gfm9tZWdhLCBjb2xvciA9IH5sb2NhdGlvbiwKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBNb2JpbGl0eTogJywgbW9iaWxpdHlfdHJlbmQsICc8L2JyPiBvbWVnYTogJywgb21lZ2EsICc8L2JyPiBEYXRlOiAnLCBkYXRlLCAnPC9icj4gU3RhdGU6ICcsIGxvY2F0aW9uICkpICU+JQogICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQWxsIHN0YXRlcyIsIHhheGlzPWxpc3QodGl0bGU9Im1vYmlsaXR5IHRyZW5kIikseWF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSkKCm1lYW5zICU+JSAKICBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAogIGZpbHRlcihkYXRlID4gYXMuRGF0ZSgiMjAyMC0wMi0yNSIpKSAlPiUgIyBGZWIgMjYgaXMgdGhlIGZpcnN0IGRheSB3aXRoIGFueSBtb2JpbGl0eSA8IDEKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+cGhpLCB5ID0gfm9tZWdhLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBNb2JpbGl0eTogJywgcGhpLCAnPC9icj4gb21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gRGF0ZTogJywgZGF0ZSkpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJNZWFuIG1vYmlsaXR5LCBtZWFuIG9tZWdhIChhY3Jvc3Mgc3RhdGVzKSIseGF4aXM9bGlzdCh0aXRsZT0ibW9iaWxpdHkgdHJlbmQiKSx5YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpKQoKYGBgCgpgYGB7cn0KIyBtZWFucyAlPiUgZmlsdGVyKGRhdGUgPCBmdXR1cmVbMV0pICU+JSAKIyAgIGZpbHRlcihkYXRlID4gYnVybmluWzJdKSAlPiUKIyAgIGdnc2NhdHRlcmhpc3QoeCA9ICJwaGkiLCB5ID0gIm9tZWdhIiwgCiMgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9IE5BLCBzaGFwZSA9IDE5LCBzaXplID0gMywgIyBwb2ludHMKIyAgICAgICAgICAgYWRkID0gInJlZy5saW5lIiwgCiMgICAgICAgICAgIGFkZC5wYXJhbXMgPSBsaXN0KGNvbG9yID0gImJsdWUiLCBmaWxsID0gImxpZ2h0Z3JheSIpLAojICAgICAgICAgICBjb25mLmludCA9IFRSVUUsIAojICAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAic3BlYXJtYW4iLAojICAgICAgICAgICB4bGFiID0gIm1vYmlsaXR5IHRyZW5kIiwgeWxhYiA9ICJvbWVnYSIsCiMgICAgICAgICAgIG1hcmdpbi5wbG90ID0gImRlbnNpdHkiLAojICAgICAgICAgICBtYXJnaW4uZ2d0aGVtZSA9IHRoZW1lX3ZvaWQoKSwKIyAgICAgICAgICAgbWFyZ2luLnNwYWNlID0gRkFMU0UsCiMgICAgICAgICAgIG1haW4ucGxvdC5zaXplID0gMiwKIyAgICAgICAgICAgbWFyZ2luLnBsb3Quc2l6ZSA9IDEKIyAgICAgICAgICAgKQoKbWVhbnMgJT4lIGZpbHRlcihkYXRlIDwgZnV0dXJlWzFdKSAlPiUgCiAgZmlsdGVyKGRhdGUgPiBidXJuaW5bMl0pICU+JQogIGdnc3RhdHNwbG90OjpnZ3NjYXR0ZXJzdGF0cyh4ID0gInBoaSIsIHkgPSAib21lZ2EiLCB0eXBlID0gInNwZWFybWFuIiwgdGl0bGUgPSAiTWVhbiBwaGksIE1lYW4gb21lZ2Egb3ZlciBhbGwgc3RhdGVzIikKCgpgYGAKCiMgUiBlZmZlY3RpdmUgZm9yIGFsbCBzdGF0ZXMKCmBgYHtyIFJfZWZmZWN0aXZlLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03LCBldmFsID0gVFJVRX0KYWxsX3JlIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIodmFyaWFibGUgPT0gIlJfZSIpICU+JQogIGRwbHlyOjpzZWxlY3QobG9jYXRpb24sIGRhdGUsIG1lYW5fdmFsdWUpICU+JQogIHJlbmFtZShSX2UgPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkgJT4lIAogIGxlZnRfam9pbihzdGF0ZWRmLCBieT1jKCJsb2NhdGlvbiIgPSAic3RhdGVfZnVsbCIpKSAlPiUgCiAgbXV0YXRlKHJlbGF0aXZlX3BvcCA9IHRvdGFsX3BvcCAvIGFsbHN0YXRlc19wb3ApCgptZWFuX3JlIDwtIGFsbF9yZSAlPiUgZ3JvdXBfYnkoZGF0ZSkgJT4lIHN1bW1hcmlzZShSX2UgPSBtZWFuKFJfZSkpCgp3ZWlnaHRlZF9tZWFuX3JlIDwtIGFsbF9yZSAlPiUgZ3JvdXBfYnkoZGF0ZSkgJT4lIHN1bW1hcmlzZShSX2UgPSBzdW0oUl9lKnJlbGF0aXZlX3BvcCkpCgpnX3JlIDwtIGdncGxvdChhbGxfcmUsIGFlcyh4ID0gZGF0ZSwgeSA9IFJfZSwgY29sb3IgPSBsb2NhdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsNSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIkQiLCBkaXJlY3Rpb24gPSAtMSwgYWxwaGEgPSAuNiwgZW5kID0gLjc1KSArCiAgIyB0aGVtZV9kYXJrKGJhc2VfbGluZV9zaXplID0gMC41KSArCiAgZ2VvbV9saW5lKGRhdGEgPSB3ZWlnaHRlZF9tZWFuX3JlLCBhbHBoYSA9IC42LCBzaXplID0gMiwgY29sb3IgPSAncmVkJykgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluPWZ1dHVyZVsxXSwgeG1heD1mdXR1cmVbMl0sIHltaW49MCwgeW1heD0xKSkgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGZ1dHVyZVsxXSwgeG1heCA9IGZ1dHVyZVsyXSwgeW1pbiA9IDAsIHltYXggPSA1LCBhbHBoYSA9IC4yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpCgpwX3JlIDwtIGdfcmUgJT4lIHBsb3RseTo6Z2dwbG90bHkoKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQoc2hvd2xlZ2VuZCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIyBtYXJnaW4gPSBsaXN0KGwgPSAxNTApLAogICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJSX2UiKQogICAgICAgICAgICAgICAgICkKCnBfcmUkeCRkYXRhW1s1MV1dJHRleHQgPC0gZ3N1YigncmVkJywnV2VpZ2h0ZWQgbWVhbiBvZiBhbGwgc3RhdGVzJywgcF9yZSR4JGRhdGFbWzUxXV0kdGV4dCkKCnBfcmUKYGBgCgoKIyBDcm9zcyBDb3JyZWxhdGlvbiBhbW9uZyB0aW1lcyBzZXJpZXMgb2YgUiBFZmZlY3RpdmUKCmBgYHtyfQphbGxfcmVfd2lkZSA8LSBhbGxfcmUgJT4lIAogIHNlbGVjdChkYXRlLCBsb2NhdGlvbiwgUl9lKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvY2F0aW9uLCB2YWx1ZXNfZnJvbSA9IFJfZSkgJT4lIAogIHNlbGVjdCgtZGF0ZSkKCgoKY2NmbWF0cml4IDwtIGZ1bmN0aW9uKHgpewogICMgaW5pdCBtYXRyaXggb2YgYWNmIG9iamVjdHMgYW5kIG1hdHJpeCBvZiBnZ3Bsb3RzCiAgbWxpc3QgPC0gZ2xpc3QgPC0gbWF0cml4KGxpc3QoKSwgbmNvbCA9IG5jb2woeCksIG5yb3cgPSBuY29sKHgpKQogIAogICMgZmlsbCBtYXRyaXggd2l0aCBwYWlyd2lzZSBjcm9zcyBjb3JyZWxhdGlvbiBmdW5jdGlvbnMKICBmb3IoaSBpbiAxOm5jb2woeCkpewogICAgZm9yKGogaW4gMTpuY29sKHgpKXsKICAgICAgY2NmIDwtIGNjZih4ID0geFssaV0sIHk9IHhbLGpdLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UpCiAgICAgIGcgPC0gZ2dwbG90Mjo6YXV0b3Bsb3QoY2NmKSArIHRoZW1lX21pbmltYWwoKSArCiAgICAgICAgeWxpbSgtMSwxKSArIAogICAgICAgIGxhYnModGl0bGU9cGFzdGUwKG5hbWVzKGFsbF9yZV93aWRlKVtpXSwiICIsIG5hbWVzKGFsbF9yZV93aWRlKVtqXSksIHggPSAiIiwgeT0iIikKICAgICAgbWxpc3RbaSxqXSA8LSBsaXN0KGNjZikKICAgICAgZ2xpc3RbaixpXSA8LSBsaXN0KGcpCiAgICB9CiAgfQogIHJldHVybihsaXN0KGRhdGE9bWxpc3QscGxvdHM9Z2xpc3QpKQp9CgojIGNhbGN1bGF0ZSBjcm9zcyBjb3JyZWxhdGlvbiBmdW5jdGlvbnMgZm9yIGVhY2ggc3RhdGUgcGFpcgpuIDwtIDIKcmVfY2NmX21hdHJpeCA8LSBjY2ZtYXRyaXgoYWxsX3JlX3dpZGVbLDE6bl0pCiAgCiMgcGxvdCBDQ0YgZm9yIGEgcGFpciBvZiBzdGF0ZXMKIyBnMSA8LSByZV9jY2ZfbWF0cml4WzEsMl1bWzFdXSAlPiUgZ2dwbG90Mjo6YXV0b3Bsb3QoKStsYWJzKHRpdGxlPSIiLCB4ID0gIiIsIHk9IiIpCgojIGdyb2JzIDwtIGxpc3QoZzEsZzEsZzEsZzEpCgpncm9icyA8LSByZV9jY2ZfbWF0cml4JHBsb3RzCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGdyb2JzPWdyb2JzLCBuY29sPW4sIG5yb3cgPSBuKQoKCgpgYGAKCg==